// 导入接口
import { login, getInfo } from '@/api/user'
import { profile } from '@/api/employees'
import { Message } from 'element-ui'
// 导入路由
import router, { asyncRoutes, constantRoutes, resetRouter } from '@/router'
import store from '..'
export default {
  namespaced: true,
  state() {
    return {
      token: '',
      // 保存用户信息
      userInfo: {},
      tokenTime: ''
    }
  },
  mutations: {
    // 保存token
    setToken(state, token) {
      state.token = token
    },
    // 保存时间
    setTokenTime(state, time) {
      state.tokenTime = time
    },

    // 保存到state里
    setUserInfo(state, obj) {
      state.userInfo = obj
    }
  },
  actions: {
    // 如果这个数据是发请求得来的就要写到actions里
    async login({ commit }, obj) {
      try {
        const res = await login(obj)
        commit('setToken', res.data)
        // 登录成功才存token时间
        commit('setTokenTime', Date.now())
        // 弹出成功的提示
        Message.success('登录成功')
        // 成功就跳转了
        router.push('/')
      } catch {
        console.log()
      }
    },

    // 获取用户信息
    async reqUserInfo({ commit, state }, to) {
      // 获取登录的用户信息
      const res = await getInfo()
      // 获取员工基本信息（传入当前这个用户的即可）
      const res2 = await profile(res.data.userId)

      // 把两段数据结合起来存到vuex里
      commit('setUserInfo', {
        ...res.data,
        ...res2.data
      })

      // 此时有menus了 -- 对动态路由做过滤
      const menus = state.userInfo.roles.menus
      const routes = asyncRoutes.filter(v => menus.includes(v.children[0].name))
      // 404 page must be placed at the end !!!
      routes.push(
        {
          path: '*',
          component: () => import('@/views/404'),
          hidden: true
        })

      // 把过滤后的路由对象生效成路由规则 -- 路由规则
      router.addRoutes(routes)
      // 路由表还没更新所以导致左侧菜单没生成，所以这里要更新路由表
      // 把静态路由和筛选后的动态路由组成新数组，给路由表赋值即可
      router.options.routes = [...constantRoutes, ...routes]
      // 把想去的页面再去一次就可以了
      router.push(to.path)
    },

    logout({ commit, dispatch }) {
      // 退出就应该清空所有跟这个用户有关的信息
      // 清空token
      commit('setToken', '')
      // 清空token时间
      commit('setTokenTime', '')
      // 清空用户信息
      commit('setUserInfo', {})
      // 清空路由规则
      resetRouter()
      router.push('/login')

      // 我现在要调用一个别的模块的方法
      store.dispatch('tagsView/delAllViews')

      // 参数1：方法名
      // 参数2：额外的参数，传给这个方法的
      // 参数3：配置信息，root:true，就代表这个方法要从根里面进行调用
      // dispatch('tagsView/delAllViews', [], { root: true })
    }
  }
}
